package strategy.collectionsort;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

/**
 * 在Java中最典型的应用场景是`java.util.Comparator` 和 `java.util.Collections.sort()`。
 * 以下为一个为学生排序的简单示例
 *
 * @author Liu Yicong
 * @date 2025/9/23
 */
public class SimpleClient {


	public static void main(String[] args) {
		// 创建学生列表
		List<Student> students = new ArrayList<>();
		students.add(new Student("张三", 20, 85.5));
		students.add(new Student("李四", 22, 92.0));
		students.add(new Student("王五", 20, 78.5));
		students.add(new Student("刘四", 33, 100.0));
		students.add(new Student("王老二", 24, 98.0));

		System.out.println("--- 原始列表 ---");
		students.forEach(System.out::println);

		// 场景一：按年龄排序
		System.out.println("\n--- 按年龄排序 ---");
		// 抽象策略: Comparator 接口
		// 具体策略: Lambda 表达式实现
		// 上下文: Collections
		Collections.sort(students, (s1, s2) -> Integer.compare(s1.getAge(), s2.getAge()));

		students.forEach(System.out::println);

		// 场景二：按分数排序 (使用方法引用简化)
		System.out.println("\n--- 按分数排序 ---");
		// 抽象策略: Comparator 接口
		// 具体策略: Lambda 表达式 + 方法引用实现
		students.sort(Comparator.comparingDouble(Student::getScore));

		students.forEach(System.out::println);

		// 场景三：按年龄排序，年龄相同时按分数倒序排序
		System.out.println("\n--- 按年龄排序，年龄相同时按分数倒序 ---");
		// 组合多个排序策略
		students.sort(Comparator.comparingInt(Student::getAge)
				.thenComparingDouble(Student::getScore).reversed());

		students.forEach(System.out::println);
	}
}
